home *** CD-ROM | disk | FTP | other *** search
- /*
- * $Id: lT_HELP(linux)
- "1.1 1999/08/19 14:17:16 lhecking Exp $
- *
- */
-
- /* GNUPLOT - linux.trm */
-
- /*[
- * Copyright 1993, 1998
- *
- * Permission to use, copy, and distribute this software and its
- * documentation for any purpose with or without fee is hereby granted,
- * provided that the above copyright notice appear in all copies and
- * that both that copyright notice and this permission notice appear
- * in supporting documentation.
- *
- * Permission to modify the software is granted, but not the right to
- * distribute the complete modified source code. Modifications are to
- * be distributed as patches to the released version. Permission to
- * distribute binaries produced by compiling modified sources is granted,
- * provided you
- * 1. distribute the corresponding source modifications from the
- * released version in the form of a patch file along with the binaries,
- * 2. add special version identification to distinguish your version
- * in addition to the base release version number,
- * 3. provide your name and address as the primary contact for the
- * support of your modified version, and
- * 4. retain our contact information in regard to use of the base
- * software.
- * Permission to distribute the released version of the source code along
- * with corresponding source modifications in the form of a patch file is
- * granted with same provisions 2 through 4 for binary distributions.
- *
- * This software is provided "as is" without express or implied warranty
- * to the extent permitted by applicable law.
- ]*/
-
- /*
- * This file is included by ../term.c.
- *
- * This terminal driver supports:
- * SVGA up to 1024x768x256 for PC's running the Linux Operating System
- * (also VGA 640x480x16, and SVGA 800x600x256)
- *
- * AUTHOR
- * Scott Heavner (sdh@po.cwru.edu)
- * based on original linux.trm by Tommy Frandsen (frandsen@diku.dk)
- * patched by David J. Liu (liu@molecule.phri.nyu.edu)
- * to increase perfomance and safety based on the features of SVGALib/GL.
- * send your comments or suggestions to (pixar!info-gnuplot@sun.com).
- */
-
- /*
- * Compile with Linux SVGAlib 0.95 currently maintained by
- * Harm Hanemaayer (hhanemaa@cs.ruu.nl).
- * supports Trident, Tseng, Cirrus, Oak and generic vga.
- */
-
- #include "driver.h"
-
- #ifdef TERM_REGISTER
- register_term(linux)
- #endif
-
- #ifdef TERM_PROTO
-
- #define LINUX_VCHAR FNT5X9_VCHAR
- #define LINUX_HCHAR FNT5X9_HCHAR
- #define LINUX_VTIC 5
- #define LINUX_HTIC 5
- #define LINUX_XMAX 0 /* These two entries are just place holders. */
- #define LINUX_YMAX 0 /* The actual values will be filled in init. */
-
- TERM_PUBLIC void LINUX_options __PROTO((void));
- TERM_PUBLIC void LINUX_init __PROTO((void));
- TERM_PUBLIC void LINUX_reset __PROTO((void));
- TERM_PUBLIC void LINUX_text __PROTO((void));
- TERM_PUBLIC void LINUX_graphics __PROTO((void));
- TERM_PUBLIC void LINUX_linetype __PROTO((int linetype));
- TERM_PUBLIC void LINUX_move __PROTO((unsigned int x, unsigned int y));
- TERM_PUBLIC void LINUX_vector __PROTO((unsigned int x, unsigned int y));
- TERM_PUBLIC int LINUX_text_angle __PROTO((int ang));
- TERM_PUBLIC void LINUX_put_text __PROTO((unsigned int x, unsigned int y, const char *str));
- TERM_PUBLIC void LINUX_suspend __PROTO((void));
- TERM_PUBLIC void LINUX_resume __PROTO((void));
-
- #endif
-
- #ifdef TERM_BODY
-
- #define _STRING_H_
- #include <vga.h>
-
- static int linux_vmode = G1024x768x256; /* default mode */
- static int vgacolor[] = { 7, 8, 2, 3, 4, 5, 9, 14, 12, 15, 13, 10, 11, 1, 6 };
- static int graphics_on = FALSE;
- vga_modeinfo *modeinfo;
- static int linux_startx, linux_starty, linux_lasty;
- static int linux_angle;
- int LINUX_graphics_allowed;
- extern void drop_privilege();
- extern void take_privilege();
-
- typedef (*linux_line_func_ptr) __PROTO((int x1, int y1, int x2, int y2));
-
- static void LINUX_putc __PROTO((unsigned int x, unsigned int y, int c, int ang,
- linux_line_func_ptr line_func));
-
- /* this function is called at the very beginning of main() to initialize
- * the vgalib and to revoke suid privileges.
- * /dev/console and /dev/tty\d are considered graphic terminals, all other
- * don't support the linux terminal */
-
- void
- LINUX_setup(void)
- {
- char line[256];
- FILE *pipe;
-
- LINUX_graphics_allowed = FALSE;
-
- if (geteuid() != 0)
- return; /* if we aren't root, we cannot init graphics */
-
- if ((pipe = popen("/usr/bin/tty", "r")) != NULL) {
- line[0] = 0;
- fgets(line, 256, pipe);
- pclose(pipe);
- line[strlen(line) - 1] = '\0';
- if (strcmp(line, "/dev/console") == 0 ||
- (strncmp(line, "/dev/tty", 8) == 0 && isdigit(line[8])))
- LINUX_graphics_allowed = TRUE;
- }
- if (LINUX_graphics_allowed) {
- take_privilege();
- vga_init();
- drop_privilege();
- } else {
- /* err - shouldn't we give up root uid whatever happens ?
- * or perhaps vga_init() does it ?
- */
- setuid(getuid());
- }
- }
-
- TERM_PUBLIC
- void LINUX_options()
- {
- if (!LINUX_graphics_allowed) {
- int_error("Linux terminal driver not available",NO_CARET);
- }
- fprintf(stderr, "%s\n", vga_getmodename(linux_vmode));
- }
-
- TERM_PUBLIC
- void LINUX_init()
- {
- /* vga_init () has been moved to immediately after main () for security */
- if (vga_getdefaultmode() != -1)
- linux_vmode = vga_getdefaultmode();
- /* get the default mode from GSVGAMODE, if available */
- if (!vga_hasmode(linux_vmode))
- linux_vmode = G640x480x16;
- /* test default mode first */
- if (!vga_hasmode(linux_vmode)) {
- fputs("Error, unable to initiate graphics.\n", stderr);
- return;
- } /* this mode is the bottom line */
- modeinfo = vga_getmodeinfo(linux_vmode);
- term->xmax = modeinfo->width;
- term->ymax = modeinfo->height;
- linux_lasty = modeinfo->height - 1;
- }
-
- TERM_PUBLIC void
- LINUX_reset()
- {
- if (graphics_on) {
- vga_setmode(TEXT);
- graphics_on = FALSE;
- }
- }
-
- TERM_PUBLIC void
- LINUX_text()
- {
- if (graphics_on) {
- vga_getch();
- vga_setmode(TEXT);
- graphics_on = FALSE;
- }
- }
-
- TERM_PUBLIC void
- LINUX_graphics()
- {
- if (!graphics_on) {
- vga_setmode(linux_vmode);
- graphics_on = TRUE;
- }
- }
-
- TERM_PUBLIC void
- LINUX_suspend()
- {
- vga_flip();
- }
-
- TERM_PUBLIC void
- LINUX_resume()
- {
- vga_flip();
- }
-
- TERM_PUBLIC void
- LINUX_linetype(linetype)
- int linetype;
- {
- if (linetype >= 13)
- linetype %= 13;
- vga_setcolor(vgacolor[linetype + 2]);
- }
-
- TERM_PUBLIC void
- LINUX_move(x, y)
- unsigned int x;
- unsigned int y;
- {
- linux_startx = x;
- linux_starty = y;
- }
-
- TERM_PUBLIC void
- LINUX_vector(x, y)
- unsigned int x;
- unsigned int y;
- {
- vga_drawline(linux_startx, linux_lasty - linux_starty, x, linux_lasty - y);
- linux_startx = x;
- linux_starty = y;
- }
-
- TERM_PUBLIC int
- LINUX_text_angle(ang)
- int ang;
- {
- linux_angle = ang;
- return TRUE;
- }
-
- static void
- LINUX_putc(x, y, c, ang, line_func)
- unsigned int x, y;
- int c;
- int ang;
- linux_line_func_ptr line_func;
- {
- int i, j, k;
- unsigned int pixelon;
- i = (int) (c) - 32;
- for (j = 0; j < FNT5X9_VBITS; j++) {
- for (k = 0; k < FNT5X9_HBITS; k++) {
- pixelon = (((unsigned int) (fnt5x9[i][j])) >> k & 1);
- if (pixelon) {
- switch (ang) {
- case 0:
- (*line_func) (x + k + 1, y - j, x + k + 1, y - j);
- break;
- case 1:
- (*line_func) (x - j, y - k - 1, x - j, y - k - 1);
- break;
- }
- }
- }
- }
- }
-
- TERM_PUBLIC void
- LINUX_put_text(x, y, str)
- unsigned int x, y;
- const char *str;
- {
- int i;
- switch (linux_angle) {
- case 0:
- y -= LINUX_VCHAR / 2;
- break;
- case 1:
- x += LINUX_VCHAR / 2;
- break;
- }
- for (i = 0; str[i]; i++) {
- LINUX_putc(x, linux_lasty - y, str[i], linux_angle, vga_drawline);
- switch (linux_angle) {
- case 0:
- x += LINUX_HCHAR;
- break;
- case 1:
- y += LINUX_HCHAR;
- break;
- }
- }
- }
-
- #endif
-
- #ifdef TERM_TABLE
- TERM_TABLE_START(linux_driver)
- "linux", "Linux PC with (s)vgalib",
- LINUX_XMAX, LINUX_YMAX, LINUX_VCHAR, LINUX_HCHAR,
- LINUX_VTIC, LINUX_HTIC, LINUX_options, LINUX_init, LINUX_reset,
- LINUX_text, null_scale, LINUX_graphics, LINUX_move, LINUX_vector,
- LINUX_linetype, LINUX_put_text, LINUX_text_angle,
- null_justify_text, do_point, do_arrow, set_font_null,
- 0, /* pointsize */
- TERM_CAN_MULTIPLOT, LINUX_suspend, LINUX_resume
- TERM_TABLE_END(linux_driver)
- #undef LAST_TERM
- #define LAST_TERM linux_driver
- #endif
-
- #ifdef TERM_HELP
- START_HELP(linux)
- "1 linux",
- "?commands set terminal linux",
- "?set terminal linux",
- "?set term linux",
- "?terminal linux",
- "?term linux",
- "?linux",
- " The `linux` driver has no additional options to specify. It looks at the",
- " environment variable GSVGAMODE for the default mode; if not set, it uses",
- " 1024x768x256 as default mode or, if that is not possible, 640x480x16",
- " (standard VGA)."
- END_HELP(linux)
- #endif
-